﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//template template template template template typename
//template<typename  T>
//void Swap(const T& a,const T& b)
//{
//	T tmp = a;
//	a = b;
//	b = tmp;
//}
//
//int main()
//{
//	int a = 10;
//	double b = 20.2;
//	Swap(a,(int)b);
//	cout << a << endl << b << endl;
//	return 0;
//}


//
//template<class T>
//T Add(const T& left, const T& right)
//{
//	return left + right;
//}
//int main()
//{
//	int a1 = 10, a2 = 20;
//	double d1 = 10.1, d2 = 20.2;
//	Add(a1, a2);
//	Add(d1, d2);
//	///Add((double)a1, d1);//用户自己强转
//	Add<double>(a1, d1);   //显示实例化
//
//	cout << a1 << endl << a2 << endl;
//	return 0;
//}

/**** 函数模板匹配原则 *********************************/
//int 加法函数
//int Add(int x, int y)
//{
//	return x + y;
//}
////通用加法函数
//template <typename T>
//T Add(T x, T y)
//{
//	return x + y;
//}
//int main()
//{
//	Add(1, 2);      // 与非模板函数匹配，编译器不需要特化
//	Add(1.1, 2.2);  // 调用编译器特化的Add版本
//	return 0;
//}


// // 专门处理int的加法函数
//int Add(int left, int right)
//{
//	return left + right;
//}
//
//// 通用加法函数
//template<class T1, class T2>
//T1 Add(T1 left, T2 right)
//{
//	return left + right;
//}
//
//int main()
//{
//	Add(1, 2);
//	Add(1, 2.0);
//	return 0;
//}


/******** 类的模板 *******************/
template <class T>
class Stack
{
public:
	Stack(size_t capacity = 4)
	{
		_array = new T[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void Push(const T& data);
private:
	T* _array;
	size_t _capacity;
	size_t _size;
};

template<class T>
//Stack<T>才是类型
void Stack<T>::Push(const T& data)
{
	// 扩容
	_array[_size] = data;
	++_size;
}

int main()
{
	//类模板名字不是真正的类，而实例化的结果才是真正的类。
	//Stack不是是类名
	//Stack<> 才是类型
	Stack<int> st1;
	Stack<double> st2; 
	return 0;
}